package com.yckj.dao;

import cn.hutool.crypto.SecureUtil;
import com.yckj.domain.User;
import com.yckj.util.DbUtilHikari;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;

import cn.hutool.crypto.SecureUtil;

/**
 * 对用户表的操作；注册用户、删除用户、查询用户、修改用户
 * @author xueben
 * @version 1.0
 */
public class UserDao {
    /**
     * 查询所有的用户
     * @return 包含所有用户对象的集合
     */
    public List<User> selectAllUsers(){
        //创建一个空集合，放用户对象
        List<User> userList = new ArrayList<User>();
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        conn = DbUtilHikari.getConnection();
        String sql = "SELECT * FROM users";
        //把rs里的数据转移到userList集合
       try {
           pstmt = conn.prepareStatement(sql);
           rs = pstmt.executeQuery();
           while (rs.next()) {
               User user = new User();
               user.setUserid(rs.getInt("userid"));
               user.setUsername(rs.getString("username"));
               user.setUserpsw(rs.getString("userpwd"));
               userList.add(user);
           }
           } catch (SQLException e) {
           throw new RuntimeException(e);
       } finally {
           DbUtilHikari.close(rs, pstmt, conn);
       }
       return userList;

    }
    /**
     * 修改用户信息
     * @param userid   用户编号
     * @param uname 用户名
     * @param upsw  用户密码
     * @return 修改成功返回1，失败返回0
     */
    public int updateUser(int userid, String uname, String upsw){
        int flag = 0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        conn = DbUtilHikari.getConnection();
        String sql = "UPDATE users SET username=?, userpsw=? WHERE userid=?";
        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, uname);
            pstmt.setString(2, SecureUtil.md5(upsw));
            pstmt.setInt(3, userid);
            flag = pstmt.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            DbUtilHikari.close(pstmt, conn);
        }
        return flag;
    }

    /**
     * 根据用户编号删除用户
     * @param userid 用户编号
     * @return 删除成功返回1，否则返回0
     */
    public int deleteUser(int userid) {
        int flag = 0;
        //声明一些变量
        Connection conn = null;
        PreparedStatement ptsmt = null;
        // 获取数据库连接
        conn = DbUtilHikari.getConnection();

        //定义并准备SQL语句
        String sql = "DELETE FROM users WHERE userid=?";
        try {
            ptsmt = conn.prepareStatement(sql);
            //给？赋值
            ptsmt.setInt(1, userid);
            //执行SQL语句
            flag = ptsmt.executeUpdate();

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            //关闭资源
            DbUtilHikari.close(ptsmt, conn);
        }
        return flag;
    }

    /**
     * 按用户名和密码登录
     * @param uname 用户名
     * @param upsw  密码
     * @return 登录成功返回true，失败返回false
     */
    public boolean login(String uname, String upsw){
       //flag是登录成功与否的标志，如果是true表示登陆成功
        boolean flag = false;
        //Connection表示连接 coon表示数据库连接
        Connection conn = null;
        //pstmt表示预编译对象 pstmt是执行SQL语句的
        PreparedStatement pstmt = null;
        //rs代表结果集，从数据库表里查询到的结果放在rs中 JDBC的规定
        ResultSet rs = null;
        // 获取数据库连接;从连接池里获取,不是直接从数据库打开连接
        //用连接池能提高数据库访问性能，特别是在大并发场景下
        conn = DbUtilHikari.getConnection();
        // 定义并准备SQL语句，登录查询语句select
        String sql = "SELECT * FROM users WHERE username=? AND userpsw=?";
        try {
            pstmt = conn.prepareStatement(sql);
            //给？赋值
            pstmt.setString(1, uname);
            pstmt.setString(2, SecureUtil.md5(upsw));
            //下达执行指令，执行SQL语句
            rs = pstmt.executeQuery();
            //判断rs结果集里有没有数据，next()判断rs里有数据？
            //如果next()返回true,说明rs结果集有数据（查到东西了）
            //如果next()返回false,说明rs结果集有数据（没查到东西了）
            if (rs.next()) {
                flag = true;
            }else{
                flag = false;
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            //关闭资源
            DbUtilHikari.close(rs, pstmt, conn);
        }
        return flag;
    }
    /**
     * 用户注册
     * @param uname 用户名
     * @param upsw 密码
     * @return 成功返回1，否则0
     */
    public int insertUser(String uname,String upsw){
        //1. 声明一些变量备用
        // conn代表数据库连接
        Connection conn = null;
        // 预编译对象，用pstmt执行SQL语句
        PreparedStatement pstmt = null;
        // 注册成功与否的标志，如果是0注册失败；如果1注册成功
        int flag = 0;
        // 2. 获取数据库连接
        conn = DbUtilHikari.getConnection();
        // 3. 定义并准备SQL语句
        String sql = "INSERT INTO users(username,userpsw) VALUES(?,?)";//这个SQL语句是一个添加用户的动作，username,userpsw数据库表里的字段
        try {
            pstmt = conn.prepareStatement(sql);
            //4. 给?（占位符）赋值
            pstmt.setString(1,uname);//1表示第一个?
            pstmt.setString(2, SecureUtil.md5(upsw));
            // 5. 执行SQL语句（下达执行指令）
            flag = pstmt.executeUpdate();//executeUpdate方法执行更新,执行完后返回0或者1（成功）
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            //6.关闭数据库资源
            DbUtilHikari.close(pstmt,conn);//只用了两个，就关闭两个的，关闭资源否则会造成资源泄露
        }
        return flag;



    }
}
